#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QMediaPlayer>
#include <QString>
#include <QMap>
#include <QTimer>

namespace Ui {
class Widget;
}

// 播放模式
enum PLAYERMODE
{
    ORDER_PLAY,  // 顺序播放
    RANDOM_PLAY, // 随机播放
    CIRCLE_PLAY, // 单曲循环
    MAXNUM_PLAY,
};

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();

public slots:
    // 槽函数
    // 处理按钮
    void handlePrevSlot();
    void handlePlaySlot();
    void handleNextSlot();
    void handleModeSlot();

    // 处理音乐播放位置
    // 处理音乐总时长
    void handleDurationSlot(qint64 duration);
    // 处理音乐当前时长
    void handlePositionSlot(qint64 position);

    // 处理定时器超时
    void handleTimeoutSlot();
private:
    // 初始化按钮图标
    void initButtonIcon();
    // 加载指定音乐路径
    void loadAppointMusicDir(const QString &filepath);
    // 播放指定的歌曲
    void playAppointMusic(const QString &filepath = ""); // 给它一个默认参数
    // 格式化毫秒成mm:ss
    QString formatMilliseconds(int milliseconds);
    // 加载指定歌曲的歌词
    void loadAppointLyric(const QString &filepath);
    // 将时间转换成毫秒级别
    int parseTime(const QString &time);

private:
    Ui::Widget *ui;

    // 多媒体成员变量
    QMediaPlayer * m_player;
    // 播放的状态
    bool m_playingState;
    // 播放模式
    int m_playMode;
    // 默认音乐路径
    QString m_musicPath;
    // 歌词信息 <key : value> : <时间 : 歌词>
    QMap<int, QString> m_lyricInfo;

    // 定时器（用于实时检测播放歌曲对应的位置应该显示什么歌词）
    QTimer *m_timer;

#if 0
    // 定义缓冲区大小
    const int m_bufferSize; // const 修饰的必须要在初始化列表里初始化
#endif
};

#endif // WIDGET_H
